package com.yuanheng100.ems4j.api;

import com.yuanheng100.ems4j.model.Ems4jDepartment;

import java.util.List;

/**
 * 部门管理接口
 */
public interface IDepartmentService
{

    /**
     * 根据部门id查询部门
     *
     * @param depId
     * @return 查询的部门。如果此部门不存在，则返回null
     */
    public Ems4jDepartment getDepartmentById(int depId);


    /**
     * 递归查询指定部门下的子部门
     * <br>
     *
     * @param parentId
     * @param layer    指定了递归的层数。如果num为1，则只查询parentId部门下直属的子部门；如果为0，则返回所有的子部门
     * @param depType  部门类型。如果为0，则忽略此约束，返回所有部门
     * @param appId    如果为0，则忽略app的约束
     * @return
     */
    public List<Ems4jDepartment> getSubDepartmentsByParentId(int parentId, int layer, short depType, int appId);


    /**
     * 递归查询指定部门上的父部门。
     * <br>
     * 对于父部门的父部门，放在parentDepartment属性里面。
     *
     * @param depId 当前部门的id
     * @param layer 层数。如果为0，则返回所有的上级部门
     * @param appId 如果为0，则忽略app的约束
     * @return
     */
    public Ems4jDepartment getParentDepartment(int depId, int layer, int appId);

    /**
     * 判断是否是父子部门。<br>
     * <br>
     * 如果parentDepId是subDepId的直接上级部门，则返回1；<br>
     * 如果是直接爷爷部门，则返回2，以此类推；<br>
     * 如果是同级部门，则返回0；<br>
     * 如果两者间没有从属关系，则返回-1<br>
     *
     * @param parentDepId 父部门id
     * @param subDepId    子部门id
     * @param appId
     * @return
     */
    public int isParent(int parentDepId, int subDepId, int appId);

    /**
     * 获取根部门
     *
     * @param appId
     * @return
     */
    public Ems4jDepartment getRootDepartment(int appId);

    /**
     * 添加部门
     *
     * @param department。要添加的部门，其中parentid，name不能为空
     * @return 部门自增的主键。如果返回负数，则意味操作失败
     */
    public int addDepartment(Ems4jDepartment department);


    /**
     * 修改部门。<br>
     * 删除部门操作通过更改部门的depstatus实现，不做物理删除
     *
     * @param department。要修改的部门，其中id不能为空
     * @return 更新的条数。如果返回0，则意味操作失败
     */
    public int updateDepartment(Ems4jDepartment department);

    /**
     * 获取所有的部门ID
     *
     * @return
     */
    public List<Ems4jDepartment> getAllDepartments();

    /**
     * 将子部门从部门fromDepartmentId转移到部门toDepartmentId
     *
     * @param i
     * @param fromDepartmentId
     * @param toDepartmentId
     */
    public int transferSubDepartment(Integer fromDepartmentId, Integer toDepartmentId);
}
